import axios from "axios";
import { Message } from "element-ui";
import store from "@/store";
import { getToken } from "@/utils/auth";
import router from "@/router/index";

//超时时间设置
axios.defaults.timeout = 5000;
//true允许 cookie跨域
axios.defaults.withCredentials = true;
//Content-Type 响应头
axios.defaults.headers.post["Content-Type"] =
  "application/x-www-form-urlencoded;charset=UTF-8";
// url
axios.defaults.baseURL = "http://localhost:3000";

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 在请求发送前做的操作
    if (store.getters.token) {
      // 如果token 存在
      // 每一个请求头都携带 token
      // ['X-Token'] 是 一个 自定义的 头部值
      //  从store 中获取
      config.headers["X-Token"] = getToken();
    }
    return config;
  },
  error => {
    // 请求出现错误
    // 输出错误信息
    console.log(error);
    return Promise.reject(error);
  }
);

// 响应拦截器
axios.interceptors.response.use(
  response => {
    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    // 否则的话抛出错误
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        case 401:
          router.replace({
            path: "/",
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
          break;
        case 403:
          console.log("管理员权限已修改请重新登录");
          // 跳转登录页面，并将要浏览的页面fullPath传过去
          // 登录成功后跳转需要访问的页面
          setTimeout(() => {
            router.replace({
              path: "/",
              query: {
                redirect: router.currentRoute.fullPath
              }
            });
          }, 1000);

          break;
        case 404:
          // 404请求不存在
          console.log("请求页面飞到火星去了");
          break;
      }
      // 控制台输出错误信息
      console.log("err" + error);
      // 界面显示错误信息
      Message({
        message: error.message,
        type: "error",
        duration: 5 * 1000
      });

      return Promise.reject(error);
    }
  }
);

/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function get(url, params = {}) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params
      })
      .then(response => {
        resolve(response.data);
      })
      .catch(err => {
        reject(err);
      });
  });
}

/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function post(url, data = {}) {
  
  return new Promise((resolve, reject) => {
    axios.post(url, data).then(
      response => {
        resolve(response.data);
      },
      err => {
        reject(err);
      }
    );
  });
}

/**
 * 封装delete请求
 * @param url
 * @param data
 * @returns {Promise}
 */
// delete 是保留字 所以使用 deletes 代替 delete 方法
export function deletes(url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.delete(url, data).then(
      response => {
        resolve(response.data);
      },
      err => {
        reject(err);
      }
    );
  });
}

/**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.put(url, data).then(
      response => {
        resolve(response.data);
      },
      err => {
        reject(err);
      }
    );
  });
}
